/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author wonka
 */
public class DataAccessObject {

    public DataAccessObject() {
    }
    
    public static MyConnection myConnection;
    
    public boolean Connect(String hostName, String databaseName, String userName, String password){
       
          myConnection = new MyConnection(hostName, databaseName, userName, password);
          return myConnection.testConnection();
    }
    public void closeConnect(){
        try {
            myConnection.closeConnection();
        } catch (SQLException ex) {
            Logger.getLogger(DataAccessObject.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public ResultSet Select(String TableName,String Columns, String Condition,String OrderBy) throws Exception
    {
           myConnection.setResultSet(null);
//        String columnView="";
//        for(int i=0;i<Columns.length;i++){
//            columnView += Columns[i];
//            columnView+=",";
//        }
//        columnView.substring(0, columnView.length());
        // Khai báo biến StringBuilder để tạo chuỗi Select.
        StringBuilder query = new StringBuilder( "SELECT "+Columns+ " FROM " + TableName);
        // Đưa câu lệnh điều kiện vào trong câu query
        this.AddCondition(query, Condition);
        // Đưa câu lệnh Order vào câu query
        this.AddOrderBy(query, OrderBy);
        // Chèn ký tự ';' vào cuối dòng lệnh của để cách các câu lệnh.
        query.append(";");
        // Thực thi câu query và trả kết quả ra ngoài
        return   myConnection.executeQuery(query.toString());
    } 
    
     public ResultSet Select(String TableName, String Columns,String Condition) throws Exception
    {
        return this.Select(TableName, Columns,Condition, null);
    }
    
    public ResultSet Select(String TableName, String Columns) throws Exception
    {
        return this.Select(TableName, Columns, null, null);
    }
    
    
     public boolean Insert(String TableName, HashMap<String,Object> ColumnValues) throws Exception
    {
        // Khai báo biến StringBuilder để tạo chuỗi Select.
        StringBuilder query =  new StringBuilder("INSERT INTO " + TableName);
        // Khai báo biến StringBuilder để tạo chuỗi Column Values.
        StringBuilder valueInsert = new StringBuilder();

        query.append("(");
        // Duyệt và đưa thông tin tên cột và giá trị của cột vào câu query
        for(String key : ColumnValues.keySet())
        {
            query.append(key).append(",");
            valueInsert.append("'").append(ColumnValues.get(key).toString()).append("' ,");
        }
        // Cắt bớt ký tự ',' cuối câu
        query = query.delete(query.length()-1, query.length());
        valueInsert = valueInsert.delete(valueInsert.length()-1, valueInsert.length());

        // Đưa giá trị của cột vào câu query
        query.append(") VALUES(").append(valueInsert.toString()).append(")");
        // Chèn ký tự ';' vào cuối dòng lệnh của để cách các câu lệnh.
        query.append(";");
        // Thực thi câu query và trả kết quả ra ngoài
        return this.myConnection.executeUpdate(query.toString()) > 0;
    }

    // Hàm hỗ trợ Update CSDL
    // UPDATE TableName SET ColumnName = ColumnValue WHERE Condiotion;
    public boolean Update(String TableName, HashMap<String,Object> ColumnValues, String Condition) throws Exception 
    {
        // Khai báo biến StringBuilder để tạo chuỗi Select.
        StringBuilder query = new StringBuilder("UPDATE " + TableName + " SET ");

        // Duyệt và đưa thông tin tên cột và giá trị của cột vào câu query
        for(String key : ColumnValues.keySet())
        {
            query.append(key).append(" = '").append(ColumnValues.get(key).toString()).append("',");
        }
        // Cắt bớt ký tự ',' cuối câu
        query = query.delete(query.length()-1, query.length());
        // Đưa câu lệnh điều kiện vào trong câu query
        this.AddCondition(query, Condition);
        // Chèn ký tự ';' vào cuối dòng lệnh của để cách các câu lệnh.
        query.append(";");
        // Thực thi câu query và trả kết quả ra ngoài
        return this.myConnection.executeUpdate(query.toString())> 0 ;
    }

    // Hàm hỗ trợ DELETE trong CSDL
    // DELETE FROM TableName WHERE Condition.
    public boolean Delete(String TableName,String Condition) throws Exception
    {
        // Khai báo biến StringBuilder để tạo chuỗi Select.
        StringBuilder query = new StringBuilder( "DELETE FROM " + TableName);
        // Đưa câu lệnh điều kiện vào trong câu query
        this.AddCondition(query, Condition);
        // Chèn ký tự ';' vào cuối dòng lệnh của để cách các câu lệnh.
        query.append(";");
        // Thực thi câu query và trả kết quả ra ngoài
        return this.myConnection.executeUpdate(query.toString()) > 0;
    }
      
     private void AddCondition(StringBuilder query, String Condition)
     {
         // Kiểm tra nếu condiotn khác null
         if(Condition!=null)
            query.append(" WHERE ").append(Condition);
    }

     // Hàm thêm OrderBy vào query
    private void AddOrderBy(StringBuilder query,String OrderBy)
    {
        // Kiểm tra OrderBy khác null
        if(OrderBy!=null)
            query.append(" ORDER BY ").append(OrderBy);
    }
}
